package com.yfyszk.kingbird.service.queue;



import com.yfyszk.kingbird.entity.SystemLog;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author wgc
 * @date 2019-09-03 15:58
 * 日志处理队列
 */
public class SystemLogQueue {


    //队列大小
    public static final int QUEUE_MAX_SIZE = 1000;

    //private static SystemLogQueue alarmMessageQueue = new SystemLogQueue();

    //阻塞队列
    private BlockingQueue<SystemLog> blockingQueue = new LinkedBlockingQueue<SystemLog>(QUEUE_MAX_SIZE);

    /**
     * 单例有很多种方式去实现：我采取绝对线程安全的一种方式
     * <p>
     * 静态内部类的方式，去初始化单例
     *
     * @author wgc
     */
    private static class Singleton {

        private static SystemLogQueue instance;

        static {
            instance = new SystemLogQueue();
        }

        public static SystemLogQueue getInstance() {
            return instance;
        }

    }

    /**
     * jvm的机制去保证多线程并发安全
     * <p>
     * 内部类的初始化，一定只会发生一次，不管多少个线程并发去初始化
     *
     * @return
     */
    public static SystemLogQueue getInstance() {
        return Singleton.getInstance();
    }

    /**
     * 初始化的便捷方法
     */
    public static void init() {
        getInstance();
    }

    /**
     * 消息入队
     *
     * @param systemLog
     * @return
     */
    public boolean push(SystemLog systemLog) {
        return this.blockingQueue.add(systemLog);//队列满了就抛出异常，不阻塞
    }

    /**
     * 消息出队
     *
     * @return
     */
    public SystemLog poll() {
        SystemLog result = null;
        try {
            result = this.blockingQueue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 获取队列大小
     *
     * @return
     */
    public int size() {
        return this.blockingQueue.size();
    }


}
